shell script
shebang
code:_.sh
コマンド(バッククォート)
code:a.sh
echo ls | peco
echo $(ls | peco)
変数
code:a.sh
V="abc" # 変数の宣言はスペースを開けない
echo "${V}def"
if
code:a.sh
then
else
fi
# if $V =~ ab ; then # regular expression
# equal =, not equal !=,
注意
[ $V = "a"] のようにカッコにくっつけるとだめ
aと]が連結してしまうから(たぶん)
エラーはでない
case
code:a.sh
case $ABC in
hello) echo 123 ;;
bye) ;;
*) echo "他" ;;
esac
コマンド実行
code:a.sh
CM="date"
${CM} +%s
CM2="date +%s"
eval "${CM2}" # ダブクオないとおかしくなることがある
複数行 => バクスラで良いがバクスラの直後に改行する必要がある \LF
改行コードがcrlfだとたぶん動かない(wsl)
$ if which ruby;then; ruby a.rb ;fi # コマンドがあったら実行
$ if -f a.txt ; then; echo "あり";fi # ファイルの存在
$ if [[ cat file |grep a ]];then ;fi # ファイルに文字が含まれるか
shell script内でcdするとちゃんと場所を移動している(script終了時に戻る)
sh a.shではなくsource a.shだと場所を移動するらしい
ifだとsh/bash/zshによって, 挙動が違うのでもしかしたらcase文のほうがいいかも
終了ステータス
code:a.sh
echo $? # 最後のコマンドの終了ステータスを返す
exit 0 # success
exit 1 # errors
$? 直前のコマンド成功失敗
成功なら0
for文の中だと...
? shebang
$# 引数の数
shift 引数の配列の先頭を削除
read 入力待ち(rubyのgets)
クォーテーション
$ echo "pwd" # /Users/...
$ echo 'pwd' # pwd
read
複数行のコメントアウト
code:a.sh
<< COMMENTOUT
aaa
COMMENTOUT
文字列
安全のためダブクオがいる
バッククォートや変数も""がないと文字列ではなくコマンドになってしまうことがあるので
code:a.sh
"command"
"${ABC}"
コメントアウト
コメントアウトの前にspaceを開けないと
code:a.sh
AB="test"# 123 error
date# error
[]はtestと等価らしい
$ test "a" = "a" && echo 1
$ cat <(echo 123) # 一時的に作られた中身が123のファイルを読む
;, &&, ||
cmd1 ; cmd2 cmd1が失敗成功に関わらず、 cmd2が実行
cmd1 && cmd2 cmd1が成功したらcmd2が実行
cmd1 || cmd2 cmd1が失敗したらcmd2が実行